<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>各种数据库的分页查询SQL解决方案</title>
<style>
.c1{
	font-size: 24px;
	color: #69F;
	font-weight: bolder;
}
.c2{
	font-size:16px;
	color: #639;
	font-weight:bold;
}
.c3{
	color: #660;
}
a {font-size:16px}   
a:link {color: blue; text-decoration:none;}
a:active:{color: red; } 
a:visited {color:purple;text-decoration:none;}
a:hover {color: red; text-decoration:underline;}
</style>
</head>

<body>
<p style="color: #69F; text-align: center; font-size: 18px; font-weight: bold;">各种数据库的分页查询SQL解决方案</p>
<p class="c1"><a href="#mssql">一、MSSQL</a><br />
<a href="#oracle">二、Oracle</a><br /> 
<a href="#mysql">三、MySQL</a><br /> 
<a href="#db2">四、DB2</a>
</p>
<p class="c1">&nbsp;</p>
<p>各种数据库的分页查询SQL解决方案：</p>
<p id="mssql" class="c1">一、MSSQL：</p>
<p class="c2">（1）、分页式：按分页查询，从表中查询第P页且每页显示N条记录的结果集：（P&gt;0&amp;&amp;N&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT TOP(N) * FROM 表名 <br />
  WHERE (主键 NOT IN (SELECT TOP((P-1)*N) 主键 FROM 表名 [排序规则一])) <br />
[排序规则二]</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：先从原表中排除掉前(P-1)*N条记录，之后，再从剩下没有被排除的记录中查询出前N条记录，即可获得第P页且每页显示N条记录的结果集。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT [TOP(N)] * FROM (SELECT TOP(P*N) * FROM 表名 [排序规则一]) T1 <br />
  WHERE (T1.主键 NOT IN (SELECT TOP((P-1)*N) T2.主键 FROM 表名 T2 [排序规则二])) <br />
[排序规则三]</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：先从原表中查询出前(P*N) 条记录，再从这(P*N) 条记录中排除掉前((P-1)*N)条记录，之后，再从剩下没有被排除的记录中查询出前N条记录，即可获得第P页且每页显示N条记录的结果集。<br />
说明：“排序规则一”、“排序规则二”和“排序规则三”是可选的，且必须是完全相同的排序规则。<br />
</p>
<p>其实，从原理可知，改进型方案的“TOP(N)”和“排序规则三”已经显得多余了，所以，我们又得下面的完美型方案。</p>
<p class="c3">C、完美型：</p>
<p>SELECT  * FROM (SELECT TOP(P*N) * FROM 表名 [排序规则一]) T1 <br />
WHERE (T1.主键 NOT IN (SELECT TOP((P-1)*N) T2.主键 FROM 表名 T2 [排序规则二])) </p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：先从原表中查询出前(P*N)条记录，再从这(P*N)条记录中排除掉前((P-1)*N)条记录，即可获得第P页且每页显示N条记录的结果集。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">D、MAX()方案：</p>
<p>SELECT TOP(N) * FROM 表名<br />
WHERE 整型列名&gt;(SELECT ISNULL(MAX(整型列名),0) FROM (SELECT TOP((P-1)*N) 整型列名 FROM 表名 ORDER BY 整型列名) TT) </p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
要求：此方案只能对含有“整型列”的表进行分页查询。“整型列名”通常是主键。</p>
<p class="c3">E、ROW_NUMBER()方案：</p>
<p>SELECT * FROM <br />
  (SELECT *,ROW_NUMBER() OVER(ORDER BY 排序规则) AS rnum FROM 表名) TT <br />
WHERE TT.rnum&gt;((P-1)*N) AND TT.rnum&lt;=(P*N)</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
要求：此方案只能用于SQL Server2005以上的版本，SQL Server2000由于没有ROW_NUMBER()函数，将不可用。</p>
<p class="c2">（2）、始末式：按起点和终点查询，从表中查询第N条到第M条的结果集：（M&gt;N&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT TOP(M-N+1) * FROM 表名 <br />
  WHERE (主键 NOT IN (SELECT TOP(N-1) 主键 FROM 表名 [排序规则一])) <br />
  [排序规则二]</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：先从原表中排除掉前(N-1)条记录，之后，再从剩下没有被排除的记录中查询出前(M-N+1)条记录，即可获得第N条到第M条记录的结果集。<br />
  说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT TOP(M-N+1) * FROM (SELECT TOP(M) *  FROM 表名 [排序规则一]) T1 <br />
  WHERE (T1.主键 NOT IN (SELECT TOP(N-1) T2.主键 FROM 表名 T2 [排序规则二])) <br />
[排序规则三]</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：先从原表中查询出前M条记录，再从这M条记录中排除掉前(N-1) 条记录，之后，再从剩下没有被排除的记录中查询出前(M-N+1)条记录，即可获得第N条到第M条记录的结果集。<br />
说明：“排序规则一”、“排序规则二”和“排序规则三”是可选的，且必须是完全相同的排序规则。</p>
<p>其实，从原理可知，改进型方案的“TOP(M-N+1)”和“排序规则三”已经显得多余了，所以，我们又得下面的完美型方案。</p>
<p class="c3">C、完美型：</p>
<p>SELECT * FROM (SELECT TOP(M) *  FROM 表名 [排序规则一]) T1 <br />
WHERE (T1.主键 NOT IN (SELECT TOP(N-1) T2.主键 FROM 表名 T2 [排序规则二])) </p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：先从原表中查询出前M条记录，再从这M条记录中排除掉前(N-1) 条记录，即可获得第N条到第M条记录的结果集。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">D、ROW_NUMBER()方案：</p>
<p>SELECT * FROM <br />
  (SELECT *,ROW_NUMBER() OVER(ORDER BY 排序规则) AS rnum FROM 表名) TT <br />
WHERE TT.rnum BETWEEN N AND M</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
要求：此方案只能用于SQL Server2005以上的版本，SQL Server2000由于没有ROW_NUMBER()函数，将不可用。</p>
<p class="c2">（3）、始量式：按起点和度量查询，从表中的第N条开始查询并获取L条记录的结果集：（N&gt;0&amp;&amp;L&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT TOP(L) * FROM 表名 <br />
  WHERE (主键 NOT IN (SELECT TOP(N-1) 主键 FROM 表名 [排序规则一])) <br />
[排序规则二]</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：先从原表中排除掉前N-1条记录，之后，再从剩下没有被排除的记录中查询出前L条记录，即可获得从第N条开始的L条记录的结果集。<br />
  说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT TOP(L) * FROM (SELECT TOP(N+L-1) *  FROM 表名 [排序规则一]) T1 <br />
  WHERE (T1.主键 NOT IN (SELECT TOP(N-1) T2.主键 FROM 表名 T2 [排序规则二])) <br />
  [排序规则三]</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：先从原表中查询出前(N+L-1)条记录，再从这(N+L-1)条记录中排除掉前(N-1) 条记录，之后，再从剩下没有被排除的记录中查询出前L条记录，即可获得从第N条开始的L条记录的结果集。<br />
  说明：“排序规则一”、“排序规则二”和“排序规则三”是可选的，且必须是完全相同的排序规则。</p>
<p>其实，从原理可知，改进型方案的“TOP(L)”和“排序规则三”已经显得多余了，所以，我们又得下面的完美型方案。</p>
<p class="c3">C、完美型：</p>
<p>SELECT * FROM (SELECT TOP(N+L-1) *  FROM 表名 [排序规则一]) T1 <br />
  WHERE (T1.主键 NOT IN (SELECT TOP(N-1) T2.主键 FROM 表名 T2 [排序规则二])) </p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：先从原表中查询出前(N+L-1)条记录，再从这(N+L-1)条记录中排除掉前(N-1) 条记录，即可获得从第N条开始的L条记录的结果集。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">D、ROW_NUMBER()方案：</p>
<p>SELECT * FROM <br />
  (SELECT *,ROW_NUMBER() OVER(ORDER BY 排序规则) AS rnum FROM 表名) TT <br />
  WHERE TT.rnum BETWEEN N AND (N+L-1)</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
要求：此方案只能用于SQL Server2005以上的版本，SQL Server2000由于没有ROW_NUMBER()函数，将不可用。</p>
<p>&nbsp;</p>
<p id="oracle" class="c1">二、Oracle：</p>
<p class="c2">（1）、分页式：按分页查询，从表中查询第P页且每页显示N条记录的结果集：（P&gt;0&amp;&amp;N&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T2.* FROM (SELECT T1.* FROM 表名 T1 [排序规则一]) T2 )<br />
  WHERE rnum&gt;((P-1)*N) AND rnum&lt;=(P*N)<br />
  [排序规则二]</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T1.* FROM 表名 T1 WHERE ROWNUM&lt;=(P*N) [排序规则一]) T2<br />
  WHERE T2.rnum&gt;((P-1)*N)<br />
[排序规则二]</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c2">（2）、始末式：按起点和终点查询，从表中查询第N条到第M条的结果集：（M&gt;N&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T2.* FROM (SELECT T1.* FROM 表名 T1 [排序规则一]) T2 )<br />
  WHERE rnum BETWEEN N AND M<br />
  [排序规则二]</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
  说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T1.* FROM 表名 T1 WHERE ROWNUM&lt;=(M) [排序规则一]) T2<br />
  WHERE T2.rnum&gt;=N<br />
[排序规则二]</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c2">（3）、始量式：按起点和度量查询，从表中的第N条开始查询并获取L条记录的结果集：（N&gt;0&amp;&amp;L&gt;0）</p>
<p class="c3">A、普通型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T2.* FROM (SELECT T1.* FROM 表名 T1 [排序规则一]) T2 )<br />
  WHERE rnum&gt;=N AND rnum&lt;(N+L)<br />
[排序规则二]</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p class="c3">B、改进型：</p>
<p>SELECT * FROM ( SELECT ROWNUM rnum,T1.* FROM 表名 T1 WHERE ROWNUM&lt;(N+L) [排序规则一] ) T2<br />
  WHERE T2.rnum&gt;=N<br />
  [排序规则二]</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：充分利用Oracle的ROWNUM关键字。<br />
说明：“排序规则一”和“排序规则二”是可选的，且必须是完全相同的排序规则。</p>
<p>&nbsp;</p>
<p id="mysql" class="c1">三、MySQL：</p>
<p class="c2">（1）、分页式：按分页查询，从表中查询第P页且每页显示N条记录的结果集：（P&gt;0&amp;&amp;N&gt;0）</p>
<p>SELECT * FROM 表名 [WHERE查询条件] [排序规则] LIMIT (P-1)*N, N</p>
<p>用法：请分别替换“表名”、N、P为实际值。<br />
  原理：充分利用MySQL的LIMIT函数。<br />
说明：“WHERE查询条件”和“排序规则”是可选的。</p>
<p class="c2">（2）、始末式：按起点和终点查询，从表中查询第N条到第M条的结果集：（M&gt;N&gt;0）</p>
<p>SELECT * FROM 表名 [WHERE查询条件] [排序规则] LIMIT (N-1), (M-N+1)</p>
<p>用法：请分别替换“表名”、N、M为实际值。<br />
  原理：充分利用MySQL的LIMIT函数。<br />
  说明：“WHERE查询条件”和“排序规则”是可选的。</p>
<p class="c2">（3）、始量式：按起点和度量查询，从表中的第N条开始查询并获取L条记录的结果集：（N&gt;0&amp;&amp;L&gt;0）</p>
<p>SELECT * FROM 表名 [WHERE查询条件] [排序规则] LIMIT (N-1), L</p>
<p>用法：请分别替换“表名”、N、L为实际值。<br />
  原理：充分利用MySQL的LIMIT函数。<br />
  说明：“WHERE查询条件”和“排序规则”是可选的。</p>
<p>&nbsp;</p>
<p id="db2" class="c1">四、DB2：</p>
</body>
</html>
